import json
import re
from django.shortcuts import render
from django.views import View
from apps.users.models import User
from django.http import JsonResponse

class UsernameCountView(View):
    """判断用户名是否重复注册"""
    def get(self, request, username):
        """
        :param request: 请求对象
        :param username: 用户名
        :return: JSON
        """
        count = User.objects.filter(username=username).count()
        return JsonResponse({'code': 0, 'errmsg': 'OK', 'count': count})

class MobileCountView(View):
    """判断手机号是否重复注册"""
    def get(self, request, mobile):
        count = User.objects.filter(mobile=mobile).count()
        return JsonResponse({'code': 0, 'errmsg': 'OK', 'count': count})

class RegisterView(View):
    """用户注册"""
    def post(self, request):
        # 非表单类型django无法直接解析,使用body属性获取原始数据进行解析,request.body返回bytes类型,需使用decode()方法解码
        body_byte = request.body
        body_str = body_byte.decode()
        body_dict = json.loads(body_str)
        print(body_dict)

        # 获取参数值
        username = body_dict.get('username')
        password = body_dict.get('password')
        password2 = body_dict.get('password2')
        mobile = body_dict.get('mobile')
        allow = body_dict.get('allow')
        # 短信验证码参数
        sms_code_client = body_dict.get('sms_code')


        # 判断参数是否齐全
        if not all([username,password,password2,mobile,allow]): # all()方法,列表中有值为None则返回False
            return JsonResponse({'code':400},{'errmsg':'参数有误'})
        # 判断用户名是否是5-20个字符
        if not re.match('^[a-zA-Z0-9_-]{5,20}$',username):
            return JsonResponse({'code':400},{'errmsg':'用户名不符合规则'})
        # 密码至少8位,字母或数字
        if not re.match('^[0-9A-Za-z]{8,20}$', password):
            return JsonResponse({'code': 400, 'errmsg': '密码不符合规则'})
        # 判断两次密码是否一致
        if password != password2:
            return JsonResponse({'code': 400, 'errmsg': '两次密码不一致'})
        # 判断手机号是否合法
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return JsonResponse({'code': 400, 'errmsg': '手机号格式有误'})
        # 判断是否勾选用户协议
        if allow != True:
            return JsonResponse({'code': 400, 'errmsg': '未勾选用户协议'})

        # 提取服务端存储的短信验证码
        from django_redis import get_redis_connection
        redis_cli = get_redis_connection('code')
        sms_code_server = redis_cli.get(mobile)     # sms_code_server是bytes
        # 判断短信验证码是否过期
        if not sms_code_server:
            return JsonResponse({'code': 400, 'errmsg': '短信验证码失效'})
        # 对比用户输入的和服务端存储的短信验证码是否一致
        if sms_code_client != sms_code_server.decode():
            return JsonResponse({'code': 400, 'errmsg': '短信验证码有误'})

        # 数据入库
        # 方式1
        # user = User(username=username, password=password, mobile=mobile)
        # user.save()

        # 方式2, 两种方式均可插入数据
        # User.objects.create(username=username, password=password, mobile=mobile)

        # 但是像上面这样直接插入数据,密码是明文存储的,所以插入用户信息时使用下面这种方式,create_user()方法中封装了set_password()方法加密密码
        try:
            user = User.objects.create_user(username=username, password=password, mobile=mobile)
        except Exception as e:
            return JsonResponse({'code': 400, 'errmsg': '注册失败!'})

        # 状态保持
        from django.contrib.auth import login
        login(request, user)

        return JsonResponse({'code': 0, 'errmsg': '注册成功!'})

